package org.ajc.auth.interceptors;

import org.ajc.base.annotation.AjcPermission;
import org.ajc.base.data.ContextMap;
import org.ajc.org.domain.Employee;
import org.ajc.org.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Objects;

/**
 * 这是一个类是用于拦截器 权限拦截的
 *      拦截器要做的事儿  认证 和 鉴权
 *      权限： 认证 和 鉴权
 */
//@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Autowired
    private EmployeeService employeeService;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取token
        String token = request.getHeader("token");
        System.out.println("获取到的token值:"+ token);
        // 根据token获取user
        Employee user = (Employee) ContextMap.loginMap.get(token);
        if (Objects.isNull(user)){
            // 没有登录
            response.getWriter().print("{\"msg\":\"NoLogin\",\"success\":false}");
            return false;
        }
        // 成功登录
        // 鉴权
        // 先判断当前资源是否需要权限?
        // 如果资源没有注解 就说明不需要权限
        // 要先获取当前的请求是 什么方法就知道是否需要权限了
        HandlerMethod method = (HandlerMethod)handler;
        Method method1 = method.getMethod();
        AjcPermission annotation = method1.getAnnotation(AjcPermission.class);
        if (Objects.isNull(annotation)){
            return true;
        }
        String simpleName = method.getBeanType().getSimpleName();
        // 获取资源的权限-sn
        String methodPermission = simpleName +":"+ method1.getName();

        // 获取用户的权限  用户的id > 用户角色 > 用户的权限sn  list
        List<String> sns = employeeService.queryPermissionsById(user.getId());
        // 将用户权限和资源权限求交集
        if (!sns.contains(methodPermission)){
            // 没有权限
            response.getWriter().print("{\"msg\":\"NoPermission\",\"success\":false}");
            return false;
        }
        return true;
    }
}
